<

ルート遷移レコードと遷移代理人の更新

まとめ

新しいブールゲッターisWaitingForExitingDecision追加されました ルート遷移レコードとisEnteringゲッター に名前が変更されましたisWaitingForEnteringDecision。 の中にresolve()遷移デリゲートのメソッド、 使用isWaitingForExitingDecision終了しているかどうかを確認する ルートは実際には、どのように移行するかについて明示的な決定を必要とします 画面の外に。既存のルートを決定しようとする場合 それかではありません決定を待っていると、Flutter はアサーション エラーをスローします。

コンテクスト

ナビゲーターは新しいページのリストを受け取ると、そのリストを更新しようとします。 現在のルートはリストと一致するようにスタックされます。ただし、明示的な情報が必要です ルートを画面上と画面外でどのように移行するかを決定します。 以前は、新しいリストにないルートには決定が必要でした 画面外に遷移する方法について。しかし、後でわかったのですが、 これは常に真実であるとは限りません。ルートがポップされた場合、 ただし、ポップアニメーションが終了するのをまだ待っています。 このルートは、ナビゲータのルート スタックに存在することになります。 アニメーションができました。この間にページの更新が行われた場合、 このルートは終了しますが、決定は必要ありません 画面外に遷移する方法について。したがって、isWaitingForExitingDecisionそのケースをカバーするために追加されました。

isEnteringgetter の名前も次のように変更されます。isWaitingForEnteringDecisionもっと説明すると、 また、命名をより一貫性のあるものにするためでもあります。

移行ガイド

独自の遷移デリゲートを実装する場合は、 ゲッターを使用してルートを終了するisWaitingForExitingDecisionあなたの前に 電話markForPopmarkForComplete、 またmarkForRemoveそれらの上に。 また、からのすべての参照の名前を変更する必要があります。isEnteringisWaitingForEnteringDecision

移行前のコード:

import 'package:flutter/widgets.dart';

class NoAnimationTransitionDelegate extends TransitionDelegate<void> {
  @override
  Iterable<RouteTransitionRecord> resolve({
    List<RouteTransitionRecord> newPageRouteHistory,
    Map<RouteTransitionRecord, RouteTransitionRecord> locationToExitingPageRoute,
    Map<RouteTransitionRecord, List<RouteTransitionRecord>> pageRouteToPagelessRoutes,
  }) {
    final List<RouteTransitionRecord> results = <RouteTransitionRecord>[];

    for (final RouteTransitionRecord pageRoute in newPageRouteHistory) {
      if (pageRoute.isEntering) {
        pageRoute.markForAdd();
      }
      results.add(pageRoute);

    }
    for (final RouteTransitionRecord exitingPageRoute in locationToExitingPageRoute.values) {
      exitingPageRoute.markForRemove();
      final List<RouteTransitionRecord> pagelessRoutes = pageRouteToPagelessRoutes[exitingPageRoute];
      if (pagelessRoutes != null) {
        for (final RouteTransitionRecord pagelessRoute in pagelessRoutes) {
          pagelessRoute.markForRemove();
        }
      }
      results.add(exitingPageRoute);

    }
    return results;
  }
}

移行後のコード:

import 'package:flutter/widgets.dart';

class NoAnimationTransitionDelegate extends TransitionDelegate<void> {
  @override
  Iterable<RouteTransitionRecord> resolve({
    List<RouteTransitionRecord> newPageRouteHistory,
    Map<RouteTransitionRecord, RouteTransitionRecord> locationToExitingPageRoute,
    Map<RouteTransitionRecord, List<RouteTransitionRecord>> pageRouteToPagelessRoutes,
  }) {
    final List<RouteTransitionRecord> results = <RouteTransitionRecord>[];

    for (final RouteTransitionRecord pageRoute in newPageRouteHistory) {
      // Renames isEntering to isWaitingForEnteringDecision.
      if (pageRoute.isWaitingForEnteringDecision) {
        pageRoute.markForAdd();
      }
      results.add(pageRoute);

    }
    for (final RouteTransitionRecord exitingPageRoute in locationToExitingPageRoute.values) {
      // Checks the isWaitingForExitingDecision before calling the markFor methods.
      if (exitingPageRoute.isWaitingForExitingDecision) {
        exitingPageRoute.markForRemove();
        final List<RouteTransitionRecord> pagelessRoutes = pageRouteToPagelessRoutes[exitingPageRoute];
        if (pagelessRoutes != null) {
          for (final RouteTransitionRecord pagelessRoute in pagelessRoutes) {
            pagelessRoute.markForRemove();
          }
        }
      }
      results.add(exitingPageRoute);

    }
    return results;
  }
}

タイムライン

リリースされたバージョン: 1.18.0
安定版リリース: 1.20

参考文献

API ドキュメント:

  • Navigator
  • TransitionDelegate
  • RouteTransitionRecord

関連する問題:

  • 問題 45938: ナビゲーター 2.0

関連する PR:

  • PR 55998: ナビゲーター ページの更新クラッシュを修正しました。 まだ待機ルートがある場合